package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

import co.gov.medellin.ssti.sub.common.util.FiltrosReportesUtil;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.dao.ReporteTotalGrupoFamiliarDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;

public class ReporteTotalGrupoFamiliarDAOImpl2 extends
		NamedParameterJdbcDaoSupport implements ReporteTotalGrupoFamiliarDAO {

	public Collection<ReporteTotalGrupoFamiliarVO> findReportGrupoFamiliar(
			ReporteGrupoFamiliarVO criteria, List<CondicionConsultaVO> lFilters) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer filtros = new StringBuffer(" ");

		if (lFilters != null && lFilters.size() != 0) {
			CondicionConsultaVO condConsVO = new CondicionConsultaVO();
			for (int i = 0; i < lFilters.size(); i++) {
				condConsVO = (CondicionConsultaVO) lFilters.get(i);
				// se valida que no vengan codCampo o filtros invalidos para
				// evitar sql injection.
				if (!Utility.isCodCampoGFValido(condConsVO.getCodcampo())) {
					throw new DAOException("Codigo campo invalido.");
				}
				if (!Utility.isCodFiltroValido(condConsVO.getCodFiltro())) {
					throw new DAOException("Codigo de filtro invalido.");
				}

				if (condConsVO.getCodFiltro().equals(Utility.ENTRE)) {
					// AND COLUMNA BETWEEN ? AND ?
					filtros.append(" AND " + condConsVO.getCodcampo() + " "
							+ condConsVO.getCodFiltro()
							+ " :valor AND :valor2 ");
					namedParameters.put("valor", condConsVO.getValor());
					namedParameters.put("valor2", condConsVO.getValor2());
				}
				// AND COLUMNA LIKE '%?%'
				else if (condConsVO.getCodFiltro().equals(Utility.PARECIDO)) {
					filtros.append(" AND " + condConsVO.getCodcampo() + " "
							+ condConsVO.getCodFiltro() + " :valorLike ");
					namedParameters.put("valorLike",
							"%" + condConsVO.getValor() + "%");
				} else {
					if (!condConsVO.getCodcampo().equals(
							Utility.NUMERO_BENEFICIOS)) {
						// AND UPPER(COLUMNA) OPERADOR ?
						filtros.append(" AND UPPER(" + condConsVO.getCodcampo()
								+ " ) " + condConsVO.getCodFiltro()
								+ " :valorUpper ");
						namedParameters.put("valorUpper", condConsVO.getValor()
								.toUpperCase());
					} else {
						if (condConsVO.getCodFiltro().equals(Utility.ENTRE)) {
							filtros.append("AND NUMERO_BENEFICIOS BETWEEN :valor AND :valor2 ");
							namedParameters.put("valor", condConsVO.getValor());
							namedParameters.put("valor2",
									condConsVO.getValor2());
						} else {
							filtros.append("AND NUMERO_BENEFICIOS"
									+ condConsVO.getCodFiltro() + " :valor ");
							namedParameters.put("valor", condConsVO.getValor());
						}
					}
				}
			}
		}

		String desde = null;
		String hasta = null;
		if (criteria.getDesde() != null && !criteria.getDesde().isEmpty()) {
			desde = criteria.getDesde();
		}
		if (criteria.getDesde() != null && !criteria.getDesde().isEmpty()) {
			hasta = criteria.getHasta();
		}

		String strSql = "{call beneficios.PCS_REPORTE_GRUPO_FAMILIAR(?, ?, ?, ?, ?, ?, ?, "
				+ "'" + filtros.toString() + "'" + ", ?)}";

		System.out.println("strSql: " + strSql);

		String strAnterior = "";
		int iCount = 0;

		SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS").withProcedureName(
						"PCS_REPORTE_GRUPO_FAMILIAR");

		ArrayList<ReporteTotalGrupoFamiliarVO> lResults = new ArrayList<ReporteTotalGrupoFamiliarVO>();

		namedParameters.put("codigoComuna", criteria.getCodeComuna());
		namedParameters.put("codigoZona", criteria.getCodeZona());
		namedParameters.put("codigoBarrio", criteria.getCodeBarrio());
		namedParameters.put("codigoSubprograma", criteria.getCodeSubprograma());
		namedParameters.put("codigoPrograma", criteria.getCodePrograma());
		namedParameters.put("fechaInicio", desde);
		namedParameters.put("fechaFinal", hasta);
		namedParameters.put("filtros", filtros.toString());

		SqlParameterSource in = new MapSqlParameterSource(namedParameters);
		Map<String, Object> simpleJdbcCallResult = jdbcCall.execute(in);
		ResultSet rst = (ResultSet) simpleJdbcCallResult.get("c_resultado");
		// c_resultado out
		/*
		 * cs = conn.prepareCall(strSql);
		 * 
		 * if (criteria.getCodeComuna() == null) { cs.setNull(1,
		 * OracleTypes.NULL); } else { cs.setLong(1, criteria.getCodeComuna());
		 * } if (criteria.getCodeZona() == null) { cs.setNull(2,
		 * OracleTypes.NULL); } else { cs.setLong(2, criteria.getCodeZona()); }
		 * if (criteria.getCodeBarrio() == null) { cs.setNull(3,
		 * OracleTypes.NULL); } else { cs.setLong(3, criteria.getCodeBarrio());
		 * } if (criteria.getCodeSubprograma() == null) { cs.setNull(4,
		 * OracleTypes.NULL); } else { cs.setLong(4,
		 * criteria.getCodeSubprograma()); } if (criteria.getCodePrograma() ==
		 * null) { cs.setNull(5, OracleTypes.NULL); } else { cs.setLong(5,
		 * criteria.getCodePrograma()); } cs.setString(6, desde);
		 * cs.setString(7, hasta);
		 */
		// cs.setString(8, filtros.toString());
		// obtener el numero de parametros del cs (o el indice en donde debe
		// insertarse el siguiente parametro).
		/*
		 * int index = cs.getParameterMetaData().getParameterCount();
		 * System.out.println("index: " + index);
		 * System.out.println(criteria.getCodeComuna());
		 * System.out.println(criteria.getCodeZona());
		 * System.out.println(criteria.getCodeBarrio());
		 * System.out.println(criteria.getCodeSubprograma());
		 * System.out.println(criteria.getCodePrograma());
		 * System.out.println(desde); System.out.println(hasta); for (int i = 0;
		 * i < filterParameters.size(); i++) { index += 1;
		 * System.out.println("i " + i); cs.setString(index, (String)
		 * filterParameters.get(i)); }
		 */
		// index += 1;
		// cs.registerOutParameter(index, OracleTypes.CURSOR);
		// cs.execute();
		// rst = (ResultSet) cs.getObject(index);

		try {
			while (rst.next()) {
				ReporteTotalGrupoFamiliarVO repGFVO = new ReporteTotalGrupoFamiliarVO();
				repGFVO.setNombreGrupoFamiliar(rst.getString("NAME_GRUPOFAM"));
				repGFVO.setCodeGrupoFamiliar(rst.getString("CODE_GRUPOFAM"));
				repGFVO.setNombreJefeHogar(rst.getString("NAME1_BENE") + " "
						+ rst.getString("NAME2_BENE") + " "
						+ rst.getString("APE1_BENE") + " "
						+ rst.getString("APE2_BENE"));
				repGFVO.setCodeJefeHogar(rst.getString("CODE_BENE"));
				repGFVO.setParentesco(rst.getString("PARENTESCO"));
				repGFVO.setNombreComuna(rst.getString("NAME_COMUNA"));
				repGFVO.setNombreZona(rst.getString("NAME_ZONA"));
				repGFVO.setNombreBarrio(rst.getString("NAME_BARRIO"));
				repGFVO.setNumeroBeneficios(rst.getString("NUMERO_BENEFICIOS"));
				repGFVO.setNumeroMiembros(rst.getString("NUMERO_MIEMBROS"));
				if (!strAnterior.equals(rst.getString("NAME_GRUPOFAM"))) {
					iCount += 1;
					strAnterior = rst.getString("NAME_GRUPOFAM");
					lResults.add(repGFVO);
				}
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		}
		if (iCount > 0) {
			ReporteTotalGrupoFamiliarVO repGFVO = new ReporteTotalGrupoFamiliarVO();
			repGFVO.setNombreGrupoFamiliar("TOTAL GRUPO FAMILIAR");
			lResults.add(repGFVO);

			repGFVO = new ReporteTotalGrupoFamiliarVO();
			repGFVO.setNombreGrupoFamiliar(String.valueOf(iCount));
			lResults.add(repGFVO);
		}
		return lResults;
	}

	public Collection<ReporteTotalGrupoFamiliarVO> findIndividualReport(
			Long codeGF) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT DISTINCT BENEGF.GF_CODIGO CodeGrupoFam, GRUPOFAM.NOMBRE NomGrupoFam, BENEGF.BEN_CODIGO CodeBene, "
				+ " BENE.PRIMER_NOMBRE Nom1Bene, NVL(BENE.SEGUNDO_NOMBRE,' ') Nom2Bene, BENE.PRIMER_APELLIDO Ape1Bene, "
				+ " NVL(BENE.SEGUNDO_APELLIDO,' ') Ape2Bene, VFLEXPAREN.NOMBRE Parentesco, BENEOTOR.SBPR_CODIGO CodeSubpro, "
				+ " SUB.NOMBRE NomSub, PRO.CODIGO CodeProg, PRO.NOMBRE NomProg "
				+ " FROM TCS_BEN_BENEF_GRUPO_FAMILIAR BENEGF, TCS_BEN_BENEFICIO_OTORGADO BENEOTOR, TCS_BEN_SUBPROGRAMA SUB, "
				+ " TCS_BEN_GRUPO_FAMILIAR GRUPOFAM, TCS_BEN_BENEFICIARIO BENE, PAOYER.TCS_VALOR_FLEXIBLE VFLEXPAREN, "
				+ " TCS_BEN_PROGRAMA PRO "
				+ " WHERE BENEOTOR.BEN_CODIGO (+)= BENEGF.BEN_CODIGO "
				+ " AND SUB.CODIGO (+)= BENEOTOR.SBPR_CODIGO "
				+ " AND PRO.CODIGO (+)= SUB.PRG_CODIGO "
				+ " AND BENEGF.GF_CODIGO = GRUPOFAM.CODIGO "
				+ " AND BENEGF.BEN_CODIGO = BENE.CODIGO "
				+ " AND BENEGF.VFL_CODIGO_PARENTESCO = VFLEXPAREN.CODIGO "
				+ " AND BENEGF.GF_CODIGO = :GF_CODIGO ";

		namedParameters.put("GF_CODIGO", codeGF);

		List<ReporteTotalGrupoFamiliarVO> lResults = getNamedParameterJdbcTemplate()
				.query(query, namedParameters,
						new RowMapper<ReporteTotalGrupoFamiliarVO>() {

							public ReporteTotalGrupoFamiliarVO mapRow(
									ResultSet rs, int rowNum)
									throws SQLException {
								ReporteTotalGrupoFamiliarVO vo = new ReporteTotalGrupoFamiliarVO();
								vo.setNombreGrupoFamiliar(rs
										.getString("NomGrupoFam"));
								vo.setCodeGrupoFamiliar(rs
										.getString("CodeGrupoFam"));
								vo.setNombreJefeHogar(rs.getString("Nom1Bene")
										+ " " + rs.getString("Nom2Bene") + " "
										+ rs.getString("Ape1Bene") + " "
										+ rs.getString("Ape2Bene"));
								vo.setCodeJefeHogar(rs.getString("CodeBene"));
								vo.setParentesco(rs.getString("Parentesco"));
								vo.setNombrePrograma(rs.getString("NomProg"));
								vo.setNombreSubprograma(rs.getString("NomSub"));
								return vo;
							}
						});

		return lResults;
	}

	public Collection<ReporteTotalGrupoFamiliarVO> findTotalReportGrupoFamiliar(
			ReporteGrupoFamiliarVO criteria, List<CondicionConsultaVO> lFilters) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT DISTINCT CODE_GRUPOFAM, NAME_GRUPOFAM, CODE_BENE, "
						+ "NAME1_BENE, NAME2_BENE, APE1_BENE, APE2_BENE, "
						+ "TIPO_DOCUMENTO, NUMERO_DOCUMENTO, CODE_BARRIO, "
						+ "CODE_COMUNA, CODE_ZONA, PARENTESCO, CODE_SUBPRO, "
						+ "NAME_SUB, CODE_PROG, NAME_PROG, NAME_BARRIO, "
						+ "NAME_ZONA, NAME_COMUNA, NUMERO_BENEFICIOS, NUMERO_MIEMBROS "
						+ "FROM BENEFICIOS.VMCS_BENE_REPORTGFCRITERIA "
						+ "WHERE 1=1 ");

		String strAnterior = "";
		int iCount = 0;

		if ((Object) criteria.getCodeComuna() != null) {
			query.append(" AND CODE_COMUNA = :CODE_COMUNA ");
			namedParameters.put("CODE_COMUNA", criteria.getCodeComuna());
		}
		if ((Object) criteria.getCodeZona() != null) {
			query.append(" AND CODE_ZONA = :CODE_ZONA ");
			namedParameters.put("CODE_ZONA", criteria.getCodeZona());
		}
		if ((Object) criteria.getCodeBarrio() != null) {
			query.append(" AND CODE_BARRIO = :CODE_BARRIO ");
			namedParameters.put("CODE_BARRIO", criteria.getCodeBarrio());
		}
		if ((Object) criteria.getCodeSubprograma() != null) {
			query.append(" AND CODE_SUBPRO = :CODE_SUBPRO ");
			namedParameters.put("CODE_SUBPRO", criteria.getCodeSubprograma());
		}
		if ((Object) criteria.getCodesSubprogramas() != null) {
			query.append(" AND CODE_SUBPRO IN (");
			String[] subprogramas = criteria.getCodesSubprogramas().split(",");
			for (int i = 0; i < subprogramas.length; i++) {
				query.append(":" + subprogramas[i]);
				namedParameters.put(subprogramas[i], subprogramas[i]);
				if (i < subprogramas.length - 1) {
					query.append(", ");
				}
			}
			query.append(") ");

		}
		if ((Object) criteria.getCodePrograma() != null) {
			query.append(" AND CODE_PROG = :CODE_PROG ");
			namedParameters.put("CODE_PROG", criteria.getCodePrograma());
		}
		if ((Object) criteria.getCodesProgramas() != null) {
			query.append(" AND CODE_PROG IN (:codesProgramas) ");
			namedParameters.put("codesProgramas", criteria.getCodesProgramas());
		}

		if ((Object) criteria.getDesde() != null
				&& (Object) criteria.getHasta() != null) {
			query.append("AND FECHA_BENEFICIO BETWEEN :DESDE AND :HASTA ");
			namedParameters.put("DESDE", criteria.getDesde());
			namedParameters.put("HASTA", criteria.getHasta());
		}
		if ((Object) criteria.getDesde() != null
				&& (Object) criteria.getHasta() == null) {
			query.append("AND FECHA_BENEFICIO >= :DESDE ");
			namedParameters.put("DESDE", criteria.getDesde());
		}
		if ((Object) criteria.getDesde() == null
				&& (Object) criteria.getHasta() != null) {
			query.append("AND FECHA_BENEFICIO <= :HASTA ");
			namedParameters.put("HASTA", criteria.getHasta());
		}

		if (lFilters != null && lFilters.size() != 0) {
			CondicionConsultaVO objCondConsVO = new CondicionConsultaVO();
			for (int i = 0; i < lFilters.size(); i++) {
				objCondConsVO = (CondicionConsultaVO) lFilters.get(i);
				// Validar codCampo.
				try {
					if (!isCodCampoValido(objCondConsVO.getCodcampo(),
							"VMCS_BENE_REPORTGFCRITERIA")) {
						throw new DAOException("Campo incorrecto: ");
					}
				} catch (SQLException e) {
					throw new DAOException(
							"Error al intentar validar el campo: "
									+ objCondConsVO.getCodcampo());
				}
				/*
				 * if (!Utility.isCodCampoGFValido(objCondConsVO.getCodcampo()))
				 * { throw new DAOException("Codigo campo invalido."); }
				 */
				if (!Utility.isCodFiltroValido(objCondConsVO.getCodFiltro())) {
					throw new DAOException("Codigo de filtro invalido.");
				}
				if (objCondConsVO.getCodFiltro().equals(Utility.ENTRE)) {
					query.append(" AND " + objCondConsVO.getCodcampo()
							+ " BETWEEN :valor AND :valor2 ");
					namedParameters.put("valor", objCondConsVO.getValor());
					namedParameters.put("valor2", objCondConsVO.getValor2());

				} else if (objCondConsVO.getFiltro().equalsIgnoreCase(
						Utility.PARECIDO)) {
					query.append(" AND ");
					query.append(objCondConsVO.getCodcampo());
					query.append(" ");
					query.append(FiltrosReportesUtil.PARECIDO);
					query.append(" :valorLike ");
					namedParameters.put("valorLike",
							"%" + objCondConsVO.getValor() + "%");
				} else {
					if (!objCondConsVO.getCodcampo().equals(
							Utility.NUMERO_BENEFICIOS)) {
						query.append(" AND UPPER("
								+ objCondConsVO.getCodcampo() + ") "
								+ objCondConsVO.getCodFiltro()
								+ " :valorUpper ");
						namedParameters.put("valorUpper", objCondConsVO
								.getValor().toUpperCase());

					} else {
						if (objCondConsVO.getFiltro().equals(Utility.ENTRE)) {
							query.append(" AND NUMERO_BENEFICIOS BETWEEN :valor AND :valor2 ");
							namedParameters.put("valor",
									objCondConsVO.getValor());
							namedParameters.put("valor2",
									objCondConsVO.getValor2());
						} else {
							query.append(" AND NUMERO_BENEFICIOS "
									+ objCondConsVO.getCodFiltro() + " :valor ");
							namedParameters.put("valor",
									objCondConsVO.getValor());
						}
					}
				}
			}
		}
		query.append(" ORDER BY NAME_GRUPOFAM");

		List<ReporteTotalGrupoFamiliarVO> lResults = new ArrayList<ReporteTotalGrupoFamiliarVO>();
		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(query.toString(), namedParameters);
		for (Map<String, Object> row : rows) {
			ReporteTotalGrupoFamiliarVO vo = new ReporteTotalGrupoFamiliarVO();
			vo.setNombreGrupoFamiliar((String) row.get("NAME_GRUPOFAM"));
			vo.setCodeGrupoFamiliar((String) row.get("CODE_GRUPOFAM"));
			vo.setNombreJefeHogar((String) row.get("NAME1_BENE") + " "
					+ (String) row.get("NAME2_BENE") + " "
					+ (String) row.get("APE1_BENE") + " "
					+ (String) row.get("APE2_BENE"));
			vo.setCodeJefeHogar((String) row.get("CODE_BENE"));
			vo.setParentesco((String) row.get("PARENTESCO"));
			vo.setNombreComuna((String) row.get("NAME_COMUNA"));
			vo.setNombreZona((String) row.get("NAME_ZONA"));
			vo.setNombreBarrio((String) row.get("NAME_BARRIO"));
			vo.setNombreSubprograma((String) row.get("NAME_SUB"));
			vo.setNombrePrograma((String) row.get("NAME_PROG"));
			vo.setNumeroBeneficios((String) row.get("NUMERO_BENEFICIOS"));
			vo.setNumeroMiembros((String) row.get("NUMERO_MIEMBROS"));
			lResults.add(vo);
			if (!strAnterior.equals((String) row.get("NAME_GRUPOFAM"))) {
				iCount += 1;
				strAnterior = (String) row.get("NAME_GRUPOFAM");
			}
		}

		if (iCount > 0) {
			ReporteTotalGrupoFamiliarVO vo = new ReporteTotalGrupoFamiliarVO();
			vo.setNombreGrupoFamiliar("TOTAL GRUPO FAMILIAR");
			lResults.add(vo);

			vo = new ReporteTotalGrupoFamiliarVO();
			vo.setNombreGrupoFamiliar(String.valueOf(iCount));
			lResults.add(vo);
		}
		return lResults;
	}

	public Collection<SubprogramaVO> findProgSubprog(Long codeUser,
			String userGroupName, Long codeArea) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT DISTINCT pro.CODIGO codprog,pro.NOMBRE nompro,subpro.codigo codeSubprograma, "
				+ " UPPER(subpro.nombre) nomSubprograma, usu.codigo codeusu, subpro.usu_codigo adminbene, pro.usu_codigo adminpro "
				+ " FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ " TCS_BEN_PROGRAMA pro, "
				+ " TCS_BEN_SUBPROGRAMA_USUARIO subus, "
				+ " paoyer.tcs_usuario usu "
				+ " WHERE pro.codigo = subpro.PRG_CODIGO "
				+ " AND (subpro.CODIGO = subus.SBPR_CODIGO OR 'ADMINISTRADOR GENERAL' = :userGroupName "
				+ " OR 'SUPER USUARIO' = :userGroupName OR subpro.usu_codigo = :codeUser "
				+ " OR pro.usu_codigo = :codeUser "
				+ " ) "
				+ " AND subus.USU_CODIGO = usu.CODIGO "
				+ " AND usu.CODIGO = :codeUser ORDER BY nompro";

		namedParameters.put("userGroupName", userGroupName);
		namedParameters.put("codeUser", codeUser);

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query, namedParameters, new RowMapper<SubprogramaVO>() {

					public SubprogramaVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						SubprogramaVO vo = new SubprogramaVO();
						vo.setCodeSubPrograma(rs.getString("codeSubprograma"));
						vo.setNombre(rs.getString("nomSubprograma"));
						vo.setNombrePrograma(rs.getString("nompro"));
						vo.setCodePrograma(new Long(rs.getString("codprog")));
						return vo;
					}
				});
		return subprogramas;
	}

	public ReporteGrupoFamiliarVO findFilters(ReporteGrupoFamiliarVO repGFVO) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer strQuery = new StringBuffer();
		if ((repGFVO.getCodePrograma() != null)
				&& (repGFVO.getCodePrograma() != new Long(0))) {
			strQuery.append("SELECT PROG.NOMBRE NOMBRE_PROGRAMA, SUB.NOMBRE NOMBRE_SUBPROGRAMA"
					+ " FROM TCS_BEN_PROGRAMA PROG, TCS_BEN_SUBPROGRAMA SUB"
					+ " WHERE PROG.CODIGO = SUB.PRG_CODIGO"
					+ " AND PROG.CODIGO = :PROG.CODIGO ");
			namedParameters.put("PROG.CODIGO", repGFVO.getCodePrograma());

			if ((repGFVO.getCodeSubprograma() != null)
					&& (repGFVO.getCodePrograma() != new Long(0))) {
				strQuery.append(" AND SUB.CODIGO = :SUB.CODIGO ");
				namedParameters.put("SUB.CODIGO", repGFVO.getCodeSubprograma());
			}

			List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
					.queryForList(strQuery.toString(), namedParameters);
			for (Map<String, Object> row : rows) {
				if (repGFVO.getCodeSubprograma() != null)
					repGFVO.setNombreSubprograma((String) row
							.get("NOMBRE_SUBPROGRAMA"));
				repGFVO.setNombrePrograma((String) row.get("NOMBRE_PROGRAMA"));
			}

		}
		if (repGFVO.getCodeZona() != null || repGFVO.getCodeComuna() != null
				|| repGFVO.getCodeBarrio() != null) {
			strQuery.setLength(0);
			strQuery.append("SELECT VF.NOMBRE, TV.NOMBRE N "
					+ " FROM PAOYER.TCS_TIPO_VALOR_FLEX TV, PAOYER.TCS_VALOR_FLEXIBLE VF "
					+ " WHERE TV.CODIGO = VF.TVF_CODIGO "
					+ " AND VF.CODIGO IN (:codeZona, :codeComuna, :codeBarrio) ORDER BY N");

			namedParameters.clear();
			namedParameters.put("codeZona", repGFVO.getCodeZona());
			namedParameters.put("codeComuna", repGFVO.getCodeComuna());
			namedParameters.put("codeBarrio", repGFVO.getCodeBarrio());

			List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
					.queryForList(strQuery.toString(), namedParameters);
			for (Map<String, Object> row : rows) {
				if (repGFVO.getCodeBarrio() != null) {
					repGFVO.setNombreBarrio((String) row.get("NOMBRE"));
					continue;
				}
				if (repGFVO.getCodeComuna() != null) {
					repGFVO.setNombreComuna((String) row.get("NOMBRE"));
					continue;
				}
				if (repGFVO.getCodeZona() != null) {
					repGFVO.setNombreZona((String) row.get("NOMBRE"));
					continue;
				}
			}

		}
		return repGFVO;
	}

	private boolean isCodCampoValido(String codCampo, String nombreTabla)
			throws SQLException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT COLUMN_NAME FROM user_tab_columns WHERE table_name = :table_name ";

		namedParameters.put("table_name", nombreTabla);

		try {
			String columnName = getNamedParameterJdbcTemplate().queryForObject(
					query, namedParameters, String.class);
			if (columnName != null) {
				return true;
			}
			return false;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return false;
		}
	}

}
